iT邦幫忙

2021 iThome 鐵人賽

DAY 22
0

前言:

   今天來介紹使用Canvas 的繪圖方法來創建 2D 繪圖,並畫出觸控手勢的軌跡。

    

大綱 :

在畫布上執行的操作類型包括:

用顏色填充整個畫布。
繪製形狀,例如矩形、圓弧和路徑,其樣式與對像中定義的一樣 Paint。該 Paint對象包含有關如何繪製幾何圖形(例如直線、矩形、橢圓和路徑)的樣式和顏色信息,或者例如文本的字體。
應用轉換,例如平移、縮放或自定義轉換。
剪輯,即將形狀或路徑應用到畫布以定義其可見部分。
https://ithelp.ithome.com.tw/upload/images/20210927/20121643DxxluSjLZE.png

建立Canvas的View

class Day22Draw(context: Context): View(context) {
  private var extraCanvas: Canvas //Canvas定義了可以在屏幕上繪製的形狀。
  private var extraBitmap: Bitmap //使用畫布繪圖 API繪製緩存位圖

//paint 定義您繪製的每個形狀的顏色、樣式、字體等。
private val paint = Paint().apply {
    color = Color.WHITE // 畫筆顏色
    isAntiAlias = true // 定義是否應用邊緣平滑。
    isDither = true // 影響精度高於設備的顏色下採樣的方式。
    style = Paint.Style.STROKE // 指定要繪製的圖元是填充、描邊還是兩者(以相同顏色)。default: FILL
    strokeJoin = Paint.Join.ROUND // 指定線條和曲線段如何在描邊路徑上連接 , default: MITER
    strokeCap = Paint.Cap.ROUND // 指定描邊線和路徑的開始和結束方式。 default: BUTT
    strokeWidth = 10f // 以像素為單位指定筆劃的寬度。 default: Hairline-width (really thin)
}

private var currentX = 0f
private var currentY = 0f

private var motionTouchEventX = 0f
private var motionTouchEventY = 0f

init{
     val width = Resources.getSystem().displayMetrics.widthPixels
    extraBitmap = Bitmap.createBitmap(width, 800, Bitmap.Config.ARGB_8888)
    extraCanvas = Canvas(extraBitmap)
    extraCanvas.drawColor(Color.BLACK)
}

override fun onDraw(canvas: Canvas) {
    super.onDraw(canvas)
    
    canvas.drawBitmap(extraBitmap, 0f, 0f, null)
}

//觸控手勢處理
override fun onTouchEvent(event: MotionEvent): Boolean {
    motionTouchEventX = event.x
    motionTouchEventY = event.y

    when (event.action) {
        MotionEvent.ACTION_DOWN -> touchStart()
        MotionEvent.ACTION_MOVE -> touchMove()
    }
    return true
}

private fun touchStart() {
    currentX = motionTouchEventX
    currentY = motionTouchEventY
}

private fun touchMove() {
    val stopX = motionTouchEventX
    val stopY = motionTouchEventY
    extraCanvas.drawLine(currentX,currentY,stopX,stopY,paint)
    currentX = motionTouchEventX
    currentY = motionTouchEventY
    
    invalidate()
}

}

Activity 匯入view

class Day22Activity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    var myDay22Draw = Day22Draw(this)
    setContentView(myDay22Draw)
  }
}

執行結果:
https://ithelp.ithome.com.tw/upload/images/20210927/20121643A45HurdEtA.png

參考:

https://developer.android.com/codelabs/advanced-android-kotlin-training-canvas


上一篇
Kotlin Android 第21天,從 0 到 ML - Retrofit and Repository
下一篇
Kotlin Android 第23天,從 0 到 ML - CameraX
系列文
Kotlin Android 30天,從 0 到 ML (Machine Learning)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言